# 指定 CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)

# 设置项目名称和版本
project(tcp_chat_bar VERSION 1.0.0 DESCRIPTION "TCP聊天室" LANGUAGES C)

# 设置 C 标准 (可选值: C90, C99, C11, C17)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)  # 强制使用指定的标准
set(CMAKE_C_EXTENSIONS OFF)        # 禁用编译器扩展

# 设置项目版本号（也可以在 project() 中设置）
set(PROJECT_VERSION_MAJOR 1)
set(PROJECT_VERSION_MINOR 0)
set(PROJECT_VERSION_PATCH 0)

# 设置构建类型 (Debug, Release, RelWithDebInfo, MinSizeRel)
if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Debug)
endif()

# 设置输出目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)    # 静态库输出目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)    # 动态库输出目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)    # 可执行文件输出目录

# 包含目录设置
include_directories(
    ${CMAKE_SOURCE_DIR}/inc         # 项目头文件目录
    ${CMAKE_SOURCE_DIR}/src         # 如果需要包含源文件目录
)

# 添加子目录（如果有子模块）
# add_subdirectory(lib)            # 包含子目录中的 CMakeLists.txt

# 查找依赖包
# find_package(OpenSSL REQUIRED)   # 示例：查找 OpenSSL

# 设置编译器标志
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wpedantic")  # 警告标志
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -g -O0")        # 调试模式标志
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -O3")       # 发布模式标志

# 添加可执行文件
add_executable(${PROJECT_NAME}
    src/main.c
    src/utils.c
    src/other.c
    # 更多源文件...
)

# 或者使用文件通配符（不推荐，但有时方便）
# file(GLOB SOURCES "src/*.c")
# add_executable(${PROJECT_NAME} ${SOURCES})

# 添加库（静态库）
# add_library(mylib STATIC src/mylib.c)

# 添加库（动态库/共享库）
# add_library(mylib SHARED src/mylib.c)

# 链接库到可执行文件
# target_link_libraries(${PROJECT_NAME} PRIVATE mylib)

# 链接系统库
# target_link_libraries(${PROJECT_NAME} PRIVATE m)  # 数学库
# target_link_libraries(${PROJECT_NAME} PRIVATE pthread)  # 线程库

# 链接外部库（通过 find_package 找到的）
# target_link_libraries(${PROJECT_NAME} PRIVATE OpenSSL::SSL OpenSSL::Crypto)

# 设置目标属性
set_target_properties(${PROJECT_NAME} PROPERTIES
    C_STANDARD 11
    C_STANDARD_REQUIRED ON
    C_EXTENSIONS OFF
)

# 安装规则（make install 时使用）
install(TARGETS ${PROJECT_NAME}
    RUNTIME DESTINATION bin        # 安装可执行文件到 /usr/local/bin
    LIBRARY DESTINATION lib        # 安装库文件到 /usr/local/lib
    ARCHIVE DESTINATION lib        # 安装静态库到 /usr/local/lib
)

# 安装头文件
# install(DIRECTORY include/ DESTINATION include)

# 添加测试（需要启用 testing）
# enable_testing()
# add_test(NAME test1 COMMAND ${PROJECT_NAME} --test)

# 添加自定义目标
add_custom_target(run
    DEPENDS ${PROJECT_NAME}
    COMMAND ./${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${PROJECT_NAME}
    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
)

# 添加代码格式检查目标（需要 clang-format）
# find_program(CLANG_FORMAT clang-format)
# if(CLANG_FORMAT)
#     add_custom_target(format
#         COMMAND ${CLANG_FORMAT} -i ${SOURCES} ${HEADERS}
#         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
#     )
# endif()

# 添加文档生成目标（需要 doxygen）
# find_package(Doxygen)
# if(DOXYGEN_FOUND)
#     add_custom_target(doc
#         COMMAND ${DOXYGEN_EXECUTABLE} Doxyfile
#         WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
#         COMMENT "Generating API documentation with Doxygen"
#     )
# endif()